package app;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import dominio.Cliente;
import dominio.Cotizacion;
import dominio.Domicilio;
import dominio.FormaPago;
import dominio.ItemPedido;
import dominio.ItemSolicitud;
import dominio.OrdenPedido;
import dominio.Pais;
import dominio.Rodamiento;
import dominio.SolicitudCotizacion;
import bean.srv.ClientesSRV;
import bean.srv.CotizacionSRV;
import bean.srv.GeneralSRV;
import bean.srv.RodamientosSRV;
import bean.srv.OrdenPedidoSRV;

public class Odv {
	private static Odv instancia = null;
	private ClientesSRV srv;
	private RodamientosSRV srvr;
	private OrdenPedidoSRV srvOrdenPedido;
	private CotizacionSRV srvCotizacion;
	private GeneralSRV srvGeneral;
	private List<Cliente> clientes;	
	private List<Pais> paises;
	private List<ItemSolicitud>items;
	private List<OrdenPedido> ordenesPedido;
	private List<Cotizacion> cotizaciones;
	private String direccion;
	private String nombre;
	//private List<OrdenCompra> ordenesCompra;
	//private  List<Remito> remitos;
	
	private Odv(){
		srv=new ClientesSRV();
		srvr=new RodamientosSRV();
		srvOrdenPedido = new OrdenPedidoSRV();
		srvCotizacion = new CotizacionSRV();
		srvGeneral = new GeneralSRV();
		this.clientes = new ArrayList<Cliente>();
		this.items = new ArrayList<ItemSolicitud>();
		this.paises = new ArrayList<Pais>();
		this.ordenesPedido = new ArrayList<OrdenPedido>();
		this.cotizaciones = new ArrayList<Cotizacion>();
	}
	
	public static Odv getinstancia (){
		if(instancia==null){
			instancia=new Odv();	
		}
		return instancia;
	}
	
	/* METODOS UTILIZADOS PARA EL ABM DE CLIENTES*/
	public void agregarCliente(String idCliente, String razonSoc, String tel,String calle,
			String numero,String piso,String departamento,String localidad){
		Cliente cli =new Cliente();
		
		cli.setIdCliente(idCliente);
		cli.setRazonSocial(razonSoc);
		cli.setTelefono(tel);
		Domicilio dom= new Domicilio();
		dom.setCalle(calle);
		dom.setNumero(numero);
		dom.setPiso(piso);
		dom.setDepartamento(departamento);
		dom.setLocalidad(localidad);
		cli.setDomicilio(dom);
		
		srv.agregarCliente(cli);
		this.clientes.add(cli);
	}
	
	public void eliminarCliente(String id){
		
		if(this.clientes.size()!=0){			
			int i;
			for(i=0;i<this.clientes.size() && clientes.get(i).getIdCliente().equalsIgnoreCase(id) ;i++);
			if(i<this.clientes.size())
				this.clientes.remove(i);		
			}
			Cliente cli=new Cliente();
			cli.setIdCliente(id);
			cli=srv.loadCliente(cli);
			srv.eliminarCliente(cli);
	}
	
	public void listarClientes(){
		List<Cliente> lista=srv.listarClientes();
		for(Cliente cli :lista)
			System.out.println(cli);
	}
	
	public void modificarCliente (String idCliente,String razonSocial, String calle,String numero,String piso,String departamento,String localidad,String telefono){
		srv.modificarCliente(idCliente,razonSocial, calle, numero, piso, departamento, localidad, telefono);
	}
	
	public String ultimoIdCliente(){
		return srv.ultimoIdCliente();
	}
	
	public List<String> listaId(){
		return srv.listaId();
	}
	
	public Cliente buscarCliente (String id){
		return srv.buscarCliente(id);
	}
	
	public String imprimirCliente(String id){
		return srv.imprimirCliente(id);
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	
					/*******************************requerimienro uno hay que modificarlo************************************************/
		
	public boolean esClienteValido(String id){
		return srv.esCliente(id);
	}
	
	public boolean coincideIdRz(String id,String rz){
		return srv.coincideIdRz(id, rz);
	}
	
	public boolean existeNs(String ns){
		return srv.existeNs(ns);
	}

	public void generarListaDeItems ( String serie,String sufijo,String marca,String origen ,int cantidad){
		ItemSolicitud item= new ItemSolicitud();
		item.setCantidad(cantidad);
		this.items.add(item);
		System.out.println("agrego el item a la lista");
	}
	
	public void generarListaDeSolicitudes (String cuil, int numero){
		SolicitudCotizacion sc= new SolicitudCotizacion();
		sc.setCliente(srv.buscarCliente(cuil));
		Date fecha= new Date();
		SimpleDateFormat f= new SimpleDateFormat("dd/MM/yyyy");
		sc.setFecha(f.format(fecha));
		sc.setItems(items);
		sc.setNumero(numero);
		srvCotizacion.agregarSolicitud(sc);
	}
	
	public void persistirSolicitudCotizaciones(List<SolicitudCotizacion> lista){
		srvCotizacion.agregarSolicitudCotizacion(lista);
	}
	
	
	/************************************************AMB DE RODAMIENTOS*****************************************************************/
	
	
		public void agregarRodamiento (String numeroSerie,String sufijo,String marca,String origen, int precio,int stock,String caracteristica){
			Rodamiento r= new Rodamiento();
			r.setCaracteristica(caracteristica);
			r.setPrecio(precio);
			r.setMarca(marca);
			r.setNumeroSerie(numeroSerie);
			r.setOrigen(origen);
			r.setStock(stock);
			r.setSufijo(sufijo);
			srvr.agregarRodamiento(r);
			
		}
		
		
		public boolean mismoRodamiento(String numeroSerie,String sufijo,String marca,String origen){
			return srvr.mismoRodamiento(numeroSerie,sufijo,marca, origen);
		}
	
	
		public int ultimoIdRodamiento(){
			return srvr.ultimoIdRodamiento();
		}
		
		
		public List<Integer> rodamientosId(){
			return srvr.rodamientosId();
		}
		
		public Rodamiento getRodamiento(int id){
			return srvr.getRodamiento(id);
		}
	
		public void eliminarRodamiento(int id){
			srvr.eliminarRodamiento(id);
		}
		
		
		public void modificarRodamiento(int id,String ns,String s,String m,String o, String c,float p, int cant){
			srvr.modificarRodamiento(id,ns,s,m,o,c,p,cant);
			
		}
		
		
		
		
		
		
		
		
		

		/*Orden de Pedido*/
		public void generarOrdenPedido(String fecha, int numero, String idCliente){
			Cliente cliente = this.buscarCliente(idCliente);
			OrdenPedido ordenPedido = srvOrdenPedido.newOrdenPedido(cliente, fecha, numero);
			this.ordenesPedido.add(ordenPedido);
		}
		
		public void generarItemPedido(int cantidad, String serie, String codigo, int idPais){
			Pais pais = this.paises.get(idPais);
			srvOrdenPedido.newItemPedido(cantidad, pais, serie, codigo);
		}
		
		public void agregarItemOrdenPedido(int numeroOrdenPedido, int idItemPedido){
			OrdenPedido orden = srvOrdenPedido.getOrdenPedido(numeroOrdenPedido);
			ItemPedido item = srvOrdenPedido.getItemPedido(idItemPedido);
			srvOrdenPedido.agregarItemOrdenPedido(orden, item);
		}
		
		public void asignarCotizacionOrdenPedido(int numeroOrdenPedido, int numeroCotizacion){
			Cotizacion cotizacion = srvCotizacion.getCotizacion(numeroCotizacion);
			OrdenPedido orden = srvOrdenPedido.getOrdenPedido(numeroOrdenPedido);
			srvOrdenPedido.asignarCotizacionOrdenPedido(orden, cotizacion);
		}
		
		/*Pais*/
		public void agregarPais(String sigla, String nombre){
			Pais pais = new Pais();
			pais.setSigla(sigla);
			pais.setNombre(nombre);
			this.paises.add(pais);
		}
		
		/*Forma de Pago*/
		public void agregarFormaPagoContado(float descuento){
			srvGeneral.newContado(descuento);
		}
		
		public void agregarFormaPagoFinanciado(int cantidadDias, float recargo){
			srvGeneral.newFinanciado(cantidadDias, recargo);
		}
		
		/*Cotizacion*/
		public void generarCotizacion(String fecha, String vigenciaDesde, String vigenciaHasta,
				String estado, String tipoFormaPago){
			FormaPago formaPago = srvGeneral.getFormaPagoByTipo(tipoFormaPago);
			Cotizacion cotizacion = srvCotizacion.newCotizacion(fecha, vigenciaDesde, vigenciaHasta,
					estado, formaPago);
			this.cotizaciones.add(cotizacion);
		}
		
		public void asignarCotizacionSolicitudCotizacion(int numeroCotizacion, int numeroSolicitud){
			Cotizacion cotizacion = srvCotizacion.getCotizacion(numeroCotizacion);
			SolicitudCotizacion solicitud = srvCotizacion.getSolicitudCotizacion(numeroSolicitud);
			srvCotizacion.asignarSolicitudCotizacion(cotizacion, solicitud);
		}
		
		public void cambiarEstadoCotizacion(int numeroCotizacion, String nuevoEstado){
			Cotizacion cotizacion = srvCotizacion.getCotizacion(numeroCotizacion);
			srvCotizacion.cambiarEstado(cotizacion, nuevoEstado);
		}
}
